package org.sonar.plugins.odi.rules;

import java.io.IOException;
import java.io.Writer;
import java.util.List;

import org.sonar.api.profiles.ProfileExporter;
import org.sonar.api.profiles.RulesProfile;
import org.sonar.api.rules.ActiveRule;
import org.sonar.api.rules.ActiveRuleParam;
import org.sonar.api.utils.SonarException;
import org.sonar.plugins.odi.foundation.Odi;

/**
 * Sonar Odi Plugin
 * 
 * This program is free software; you can redistribute it and/or modify it under
 * the terms of the GNU Lesser General Public License as published by the Free
 * Software Foundation; either version 3 of the License, or (at your option) any
 * later version.
 * 
 * This program is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
 * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
 * details.
 * 
 * You should have received a copy of the GNU Lesser General Public License
 * along with this program; if not, write to the Free Software Foundation, Inc.,
 * 51 Franklin Street, Fifth Floor, Boston, MA 02
 * 
 * @author Francois_Berthault
 * 
 */
public class OdiProfileExporter extends ProfileExporter {

	public OdiProfileExporter() {
		super(OdiConstants.REPOSITORY_KEY, OdiConstants.REPOSITORY_NAME);
		setSupportedLanguages(Odi.KEY);
		setMimeType("application/xml");
	}

	@Override
	public void exportProfile(RulesProfile profile, Writer writer) {
		try {
			generateXML(
					writer,
					profile.getActiveRulesByRepository(OdiConstants.REPOSITORY_KEY));

		} catch (IOException e) {
			throw new SonarException("Fail to export ODI profile : " + profile,
					e);
		}
	}

	private void generateXML(Writer writer, List<ActiveRule> activeRules)
			throws IOException {
		appendXmlHeader(writer);
		for (ActiveRule activeRule : activeRules) {
			appendRule(writer, activeRule);
		}
		appendXmlFooter(writer);
	}

	private void appendXmlHeader(Writer writer) throws IOException {
		writer.append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n")
				.append("<!-- Generated by Sonar -->\n")
				.append("<ruleset xmlns=\"http://codenarc.org/ruleset/1.0\"\n")
				.append("         xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n")
				.append("         xsi:schemaLocation=\"http://codenarc.org/ruleset/1.0 http://codenarc.org/ruleset-schema.xsd\"\n")
				.append("         xsi:noNamespaceSchemaLocation=\"http://codenarc.org/ruleset-schema.xsd\">\n");
	}

	private void appendXmlFooter(Writer writer) throws IOException {
		writer.append("</ruleset>");
	}

	private void appendRule(Writer writer, ActiveRule activeRule)
			throws IOException {
		writer.append("<rule class=\"").append(activeRule.getRuleKey());
		if (activeRule.getActiveRuleParams().isEmpty()) {
			writer.append("\"/>\n");
		} else {
			writer.append("\">\n");
			for (ActiveRuleParam activeRuleParam : activeRule
					.getActiveRuleParams()) {
				writer.append("<property name=\"")
						.append(activeRuleParam.getKey()).append("\" value=\"")
						.append(activeRuleParam.getValue()).append("\"/>\n");
			}
			writer.append("</rule>\n");
		}
	}

}
